package com.struggle.myrabbitmq.sample.topic;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.struggle.myrabbitmq.sample.MyRabbitConstants;
import com.struggle.myrabbitmq.util.ConnectionUtil;
import lombok.SneakyThrows;

import java.io.IOException;

/**
 * @className Send
 * @Description 主体模式：将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词，符号“*”匹配不多不少一个词
 * @Author liuwj3
 * @Date 2019/10/8 0008 上午 11:42
 **/
public class Send {
    /**
     * 任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
     *
     * 1.这种模式较为复杂，简单来说，就是每个队列都有其关心的主题，所有的消息都带有一个“标题”(RouteKey)，Exchange会将消息转发到所有关注主题能与
     *
     * RouteKey模糊匹配的队列。
     *
     * 2.这种模式需要RouteKey，也许要提前绑定Exchange与Queue。
     *
     * 3.在进行绑定时，要提供一个该队列关心的主题，如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
     *
     * 4.“#”表示0个或若干个关键字，“*”表示一个关键字。如“log.*”能与“log.warn”匹配，无法与“log.warn.timeout”匹配；但是“log.#”能与上述两者匹配。
     *
     * 5.同样，如果Exchange没有发现能够与RouteKey匹配的Queue，则会抛弃此消息
     * @param args
     */
    @SneakyThrows
    public static void main(String[] args) {
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();

        channel.exchangeDeclare(MyRabbitConstants.EXCHANGE_NAME_TOPIC, BuiltinExchangeType.TOPIC);

        String message = "hello world from topic";
        String message2 = "hello world2 from topic";
        String message3 = "hello world3 from topic";
        channel.basicPublish(MyRabbitConstants.EXCHANGE_NAME_TOPIC, "routekey.1", null, message.getBytes());
        channel.basicPublish(MyRabbitConstants.EXCHANGE_NAME_TOPIC, "routekey.1.2", null, message2.getBytes());
        channel.basicPublish(MyRabbitConstants.EXCHANGE_NAME_TOPIC, "routekey2.1", null, message3.getBytes());
        System.out.println(" [x] Sent '" + message + "'");
        System.out.println(" [x] Sent '" + message2 + "'");
        System.out.println(" [x] Sent '" + message3 + "'");

        channel.close();
        connection.close();
    }
}
